package com.gjt.serverSocket;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

/**
 * Created with Intel IDEA.
 * ServerSocket的信息
 *     （1）构造服务Socket
 *          public ServerSocket(int port)
 *          public ServerSocket(int port, int queueLength)
 *          public ServerSocket(int port, int queueLength, InetAddress bindAddress)
 *          public ServerSocket()
 *          queueLength: 保存入站连接请求所用的队列的长度
 *          bindAddress: 绑定的本地网络接口
 *          port传入0： 代表系统选用可用端口，成为匿名端口
 *
 *      (2)构建但不绑定端口
 *         public void bind(SocketAddress endpoint);
 *         public void bind(SocketAddress endpoint, int queueLength);
 *         主要用途允许程序在绑定端口之前设置服务器Socket 选项。有些选项在服务器socket绑定之后必须固定，
 *         ServerSocket ss = new ServerSocket();
 *         SocketAddress http = new InetAddress(80);
 *         ss.bind(http);
 *      (3)获取服务器Socket 的有关信息
 *          如果你在一个匿名端口或者一个未指定网络接口上打开了一个服务器Socket,使用
 *          public int getLocalPort();
 *          返回服务器使用的地址，如果有多个则返回ip 之一
 *          public InetAddress getInetAddress();
 *      (4)socket 选项
 *          SO_TIMEOUT: 是accept() 在抛出异常前等待入站连接的时间，如果为0 accept()不会超时
 *          SO_REUSEADDR: 他确定了是否允许一个新的Socket绑定到之前使用过的一端口
 *          SO_RCVBUF: 设置了服务器Socket 接受的客户端SOCKET 默认接受缓存大小
 *
 * @Auther: gjt
 * @Date: 2024/5/9 20:04
 */
public class ServerSocketInformation {
    private final static int PORT = 13;

    public static void main(String[] args) {
        try(ServerSocket server  = new ServerSocket(PORT)){
            // 设置阻塞不超过30 秒
            server.setSoTimeout(30000);

            boolean reuseAddress = server.getReuseAddress();


            Socket accept = server.accept();
        }catch (IOException ex){
            ex.printStackTrace();
        }
    }


    // getSoTimeout() 返回服务器当前设置的SO_TIMEOUT值
    public void printSoTimeOut(ServerSocket server) throws IOException {
        int soTimeout = server.getSoTimeout();
        if(soTimeout > 0){
            System.out.println(server + "will time out after " + soTimeout + "milliseconds");
        }else if (soTimeout == 0){
            System.out.println(server + "will never time out");
        }else {
            System.out.println("Impossible condition occurred  in " + server);
            System.out.println("Timeout cannot be less than zer");
        }
    }

    // 必须在绑定之前，为没有绑定的ServerSocket 设置这个选项
    public void setReceiveBuffer(ServerSocket server) throws IOException {

        server.setReceiveBufferSize(1024);
        server.bind(new InetSocketAddress(8000));
        server.getReceiveBufferSize();

        // connectionTime设置为2， latency设置为1 ， bandwidth设置为3 表示最大单宽是最重要的特性，最小延迟最不重要，连接时常居中
        server.setPerformancePreferences(2,1,3);
    }
}
